package com.tp.handler;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jfinal.handler.Handler;
import com.jfinal.kit.StrKit;
import com.tp.utils.PathUtils;
/**
 * 图片防盗链
 * @author TP
 *
 */
public class PicHandler extends Handler {

	@Override
	public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
		String ctx = PathUtils.getContextPath(request); // 获取网站的根路径
		String uri = request.getRequestURI(); // 获取请求的uri
		if (uri.contains(".jpg") || uri.contains(".jpeg") || uri.contains(".png") || uri.contains(".gif")) {
			// 获取图片请求的来源地址，如果是直接在浏览器中输入图片地址请求的，返回null；如果是来源于本站的，会返回当前页面的地址；如果来源于外部网站，会返回外部网站的url地址。
			String referer = request.getHeader("referer");
			if (StrKit.notBlank(referer) && !referer.contains(ctx)) {
				// 如果不为空，且请求的来源地址里面不包含本站域名，那么说明就是通过外部网站请求的，图片外部网站被请求使用。
				try {
					// 将请求转发掉，转发出一个根目录images文件夹下的一个默认图：guardAgainst.png，这样所有外站引用的图片，就全部都返回guardAgainst.png这张图片了。
					request.getRequestDispatcher("/images/guardAgainst.png").forward(request, response);
					// 不再让tomcat或者jetty处理该请求
					isHandled[0] = true;
				} catch (ServletException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			} else {
				next.handle(target, request, response, isHandled);
			}
		} else {
			next.handle(target, request, response, isHandled);
		}
	}
}